https://laihao2.com/Home/Login
ASP.NET開發操作流程:資料表設定好>再寫程式:加入資料庫>串聯資料庫>產生Models裡面類別檔dao>按:建置>Controllers裡面的Entities>產生畫面View
資料表設定好>再寫程式:加入資料庫>串聯資料庫>
其實就也是跟昨天註冊是同一個資料表~
產生Models裡面類別檔dao>按:建置>
Controllers裡面的Entities> 這裡有把Controller裡面跟資料庫的連結也寫上
ProductDBContext _db = new ProductDBContext();
        NorthwindDBContext _db2 = new NorthwindDBContext();
        int pageSize = 10;
        //`GET` 方法是用來顯示登錄頁面的。
        [AllowAnonymous]
        public ActionResult Login()
        {
            return View();
        }
        //Post: Home/Login
        [AllowAnonymous]
        [HttpPost]
        public ActionResult Login(string fUserId, string fPwd)
        {
            // 依帳密取得會員並指定給member
            var member = _db.tMember
                .Where(m => m.fUserId == fUserId && m.fPwd == fPwd)
                .FirstOrDefault();
            //若member為null,表示會員未註冊
            if (member == null)
            {
                ViewBag.Message = "帳密錯誤,登入失敗";
                return View();
            }
            //使用Session變數記錄歡迎詞
            Session["WelCome"] = member.fName + ":登入中";
            //使用Session變數記錄登入的會員物件
            Session["Member"] = member;
            //執行Home控制器的Index動作方法
            return RedirectToAction("ElectricityList2");
        }
解釋程式碼
這個代碼片段屬於 ASP.NET MVC 框架,處理用戶登錄的功能。我們逐步解讀:
ProductDBContext _db = new ProductDBContext();
NorthwindDBContext _db2 = new NorthwindDBContext();
int pageSize = 10;
_db 和 _db2:這兩行代碼分別初始化了 ProductDBContext 和 NorthwindDBContext,它們是數據庫上下文對象,通常用於訪問 ProductDB 和 NorthwindDB 數據庫中的數據。pageSize:定義分頁的大小(每頁顯示 10 條記錄),不過此變量在這個片段中沒有使用。[AllowAnonymous]
public ActionResult Login()
{
    return View();
}
[AllowAnonymous]:表示這個動作方法可以在未經身份驗證的情況下訪問,即任何用戶都可以訪問登錄頁面。ActionResult Login():這是一個 GET 方法,用於顯示登錄頁面。return View():返回登錄頁面的視圖。[AllowAnonymous]
[HttpPost]
public ActionResult Login(string fUserId, string fPwd)
[HttpPost]:表示這個方法響應 POST 請求,它處理登錄表單的提交。fUserId 和 fPwd:登錄表單提交的用戶名和密碼。var member = _db.tMember
    .Where(m => m.fUserId == fUserId && m.fPwd == fPwd)
    .FirstOrDefault();
_db.tMember 表中查詢匹配的用戶,條件是 fUserId 和 fPwd(用戶名和密碼)。FirstOrDefault():返回匹配的第一條記錄,如果沒有找到匹配項,則返回 null。if (member == null)
{
    ViewBag.Message = "帳密錯誤,登入失敗";
    return View();
}
member 是否為 null:如果查詢結果為 null,表示沒有匹配的用戶。ViewBag.Message:使用 ViewBag 傳遞錯誤信息 "帳密錯誤,登入失敗",通知用戶登錄失敗。return View():返回登錄頁面,顯示錯誤信息。Session["WelCome"] = member.fName + ":登入中";
Session["Member"] = member;
return RedirectToAction("ElectricityList2");
Session["WelCome"]:將用戶的歡迎信息(例如 "張三:登入中")存儲到 Session 中。Session["Member"]:將登錄的 member 對象存儲到 Session 中,方便後續使用,比如在其它頁面識別用戶身份。RedirectToAction("ElectricityList2"):成功登錄後,重定向到 ElectricityList2 動作方法(應該是首頁或某個功能頁)。產生畫面View程式碼
@{
    Layout = "~/Views/Shared/_Layout.cshtml";
}
@{
    ViewBag.Title = "Login";
}
<h2>作品-權限設定</h2>
<h3>依照不同帳號跟密碼登入看到的內容不同</h3>
<h3>範例:帳號A01密碼A01跟帳號A02密碼A02,帳號A01密碼A01可以看到修改按鈕</h3>
<h2>登入Login</h2>
<form action="@Url.Action("Login")" method="post">
    <div class="form-horizontal">
        <hr />
        <div class="form-group">
            <span class="control-label col-md-2">帳號account</span>
            <div class="col-md-10">
                <input type="text" id="fUserId" name="fUserId" required="required" class="form-control" />
            </div>
        </div>
        <div class="form-group">
            <span class="control-label col-md-2">密碼password</span>
            <div class="col-md-10">
                <input type="password" id="fPwd" name="fPwd" required="required" class="form-control" />
            </div>
        </div>
        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="登入Login" class="btn btn-default" />
                @ViewBag.Message
            </div>
        </div>
    </div>
</form>
解釋程式碼
這段程式碼是使用 ASP.NET MVC 架構來建立一個簡單的登入頁面。讓我逐步解釋每個部分的作用:
@{ Layout = "~/Views/Shared/_Layout.cshtml"; }這行指定了頁面所使用的母版頁面 (_Layout.cshtml),所有頁面共用的樣式和結構會來自這個母版頁面。這是一種 MVC 中的共用佈局方式,讓不同頁面共用相同的外觀。
@{ ViewBag.Title = "Login"; }這行用來設定頁面的標題,這個值會在母版頁面中顯示。 ViewBag.Title 會將字串 "Login" 傳遞給母版頁面的標題區域。
<h2>作品-權限設定</h2> 和 <h3>這些標籤定義了頁面的標題和副標題,描述了這個登入頁面的功能。副標題說明不同帳號密碼登入後會顯示不同的內容,比如帳號 A01 登入後可以看到修改按鈕,而帳號 A02 則無法。
<form action="@Url.Action("Login")" method="post">這段定義了一個表單,表單的 action 是指向 Login 動作方法,並透過 POST 請求提交表單數據。 @Url.Action("Login") 會生成指向控制器中 Login 方法的 URL。
<div class="form-horizontal">這行是表單的容器,使用了 Bootstrap 提供的 form-horizontal 類別來設定表單的樣式,讓它以水平方式排列。
<div class="form-group">
    <span class="control-label col-md-2">帳號account</span>
    <div class="col-md-10">
        <input type="text" id="fUserId" name="fUserId" required="required" class="form-control" />
    </div>
</div>
這段程式碼是用來生成帳號輸入框。<input> 標籤的 name="fUserId" 表示這個欄位的名稱,會在提交表單時將值傳送到伺服器。required="required" 使得這個欄位成為必填,class="form-control" 則是 Bootstrap 的樣式,用來設置漂亮的輸入框。
密碼輸入框的結構與帳號類似,只是輸入類型變成了 type="password",以隱藏密碼輸入。
<div class="form-group">
    <div class="col-md-offset-2 col-md-10">
        <input type="submit" value="登入Login" class="btn btn-default" />
        @ViewBag.Message
    </div>
</div>
這段生成了表單的提交按鈕。<input type="submit"> 創建了一個按鈕,當使用者點擊它時,表單會被提交。@ViewBag.Message 用來顯示從控制器傳回的訊息,通常是登入失敗或成功的提示。
列表:電費_有權限設定
依照不同帳號跟密碼登入看到的內容不同
範例:帳號A01密碼A01跟帳號A02密碼A02,帳號A01密碼A01可以看到修改按鈕
http://localhost/Web1/Home/ElectricityList2
ASP.NET開發操作流程:資料表設定好>再寫程式:加入資料庫>串聯資料庫>產生Models裡面類別檔dao>按:建置>Controllers裡面的Entities>產生畫面View
資料表設定好>再寫程式:加入資料庫>串聯資料庫>
詳細串聯的方法可以參考前幾天~
USE [ProductDB]
GO
/****** Object:  Table [dbo].[ELECTRICITY_BILL]    Script Date: 2024/9/21 下午 03:05:38 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[ELECTRICITY_BILL](
	[DOCUMENT_ID] [nvarchar](200) NOT NULL,
	[FACTORY] [nvarchar](200) NULL,
	[ELECTRICITY_SIGNAL] [nvarchar](200) NULL,
	[FROM_BILLING_PERIOD] [datetime2](7) NULL,
	[UNTIL_BILLING_PERIOD] [datetime2](7) NULL,
	[PEAK_ELECTRICITY] [decimal](18, 2) NULL,
	[HALF_SPIKE_POWER] [decimal](18, 2) NULL,
	[SATURDAY_HALF_PEAK] [decimal](18, 2) NULL,
	[OFF_PEAK_ELECTRICITY] [decimal](18, 2) NULL,
	[TOTAL_ELECTRICITY] [decimal](18, 2) NULL,
	[TOTAL_BILL_TAX] [decimal](18, 2) NULL,
	[CARBON_PERIOD] [decimal](18, 2) NULL,
	[CARBON_EMISSION_FACTOR] [decimal](18, 2) NULL,
	[CARBON_DIOXIDE] [decimal](18, 2) NULL,
	[data] [datetime] NULL,
	[CreatedBy] [nvarchar](max) NULL,
	[PDF_FILE] [varbinary](max) NULL,
	[ImageMimeType] [nvarchar](max) NULL,
	[PDF_CONTENT] [varbinary](max) NULL,
	[VOUCHER_NUMBER] [nvarchar](200) NULL,
 CONSTRAINT [PK_ELECTRICITY_BILL] PRIMARY KEY CLUSTERED 
(
	[DOCUMENT_ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
樣子
解釋sql
這段 SQL 代碼用於在 ProductDB 數據庫中創建一個名為 ELECTRICITY_BILL 的表,結構及其功能如下:
nvarchar(200), NOT NULL):這是該表的主鍵,用來唯一標識每個記錄。nvarchar(200), NULL):可能用來表示工廠的名稱或代號,儲存電力賬單與某個工廠的關聯。nvarchar(200), NULL):表示電力信號(例如,電力類型或識別電力信號的標記)。datetime2(7), NULL):電力賬單的開始周期時間。datetime2(7), NULL):電力賬單的結束周期時間。decimal(18, 2), NULL):記錄高峰期使用的電量。decimal(18, 2), NULL):記錄半尖峰時段的電力使用量。decimal(18, 2), NULL):記錄周六半尖峰時段的電力使用量。decimal(18, 2), NULL):記錄非高峰時段的電力使用量。decimal(18, 2), NULL):記錄總電力使用量。decimal(18, 2), NULL):記錄賬單總稅額。decimal(18, 2), NULL):記錄與該賬單周期相關的碳排放量。decimal(18, 2), NULL):記錄碳排放系數,用於計算碳排放量。decimal(18, 2), NULL):記錄碳排放的總二氧化碳量。datetime, NULL):存儲記錄的創建日期或與賬單相關的數據。nvarchar(max), NULL):記錄創建此賬單的用戶。varbinary(max), NULL):保存賬單的PDF文件(二進制形式)。nvarchar(max), NULL):記錄PDF文件的MIME類型。varbinary(max), NULL):另一個用於存儲PDF內容的字段。nvarchar(200), NULL):賬單憑證號。DOCUMENT_ID 的唯一性。PDF_FILE 和 PDF_CONTENT 字段保存賬單的PDF文件。這張表設計來記錄工廠的電費賬單及相關的碳排放信息,也保存了賬單的文件供後續參考。
產生Models裡面類別檔dao>按:建置>
namespace WebApplication5.Models
{
    using System;
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;
    using System.ComponentModel.DataAnnotations.Schema;
    using System.Data.Entity.Spatial;
   
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
    [Table("ELECTRICITY_BILL")]
    public partial class ELECTRICITY_BILL
    {
        [Display(Name = "通知單號碼")]
        [Required(ErrorMessage = "必填")]
        [Key]
        [StringLength(200)]
        public string DOCUMENT_ID { get; set; }
        [Display(Name = "廠區")]
        [StringLength(200)]
        public string FACTORY { get; set; }
        [Display(Name = "電號")]
        [StringLength(200)]
        public string ELECTRICITY_SIGNAL { get; set; }
        [Display(Name = "計費期間起")]
        [Column(TypeName = "datetime2")]
        public DateTime? FROM_BILLING_PERIOD { get; set; }
        public string FormattedFROM_BILLING_PERIOD
        {
            get
            {
                return FROM_BILLING_PERIOD?.ToString("yyyy-MM-dd");
            }
        }
        [Display(Name = "計費期間迄")]
        [Column(TypeName = "datetime2")]
        public DateTime? UNTIL_BILLING_PERIOD { get; set; }
        public string FormattedUNTIL_BILLING_PERIOD
        {
            get
            {
                return UNTIL_BILLING_PERIOD?.ToString("yyyy-MM-dd");
            }
        }
        [Display(Name = "尖峰用電度數")]
        public decimal? PEAK_ELECTRICITY { get; set; }
        public string FormattedPEAK_ELECTRICITY
        {
            get
            {
                return PEAK_ELECTRICITY?.ToString("#,##0");
                //return PEAK_ELECTRICITY?.ToString("0");
            }
        }
        [Display(Name = "半尖峰用電度數")]
        public decimal? HALF_SPIKE_POWER { get; set; }
        public string FormattedHALF_SPIKE_POWER
        {
            get
            {
                return HALF_SPIKE_POWER?.ToString("#,##0");
                //return HALF_SPIKE_POWER?.ToString("0");
            }
        }
        [Display(Name = "週六半尖峰用電度數")]
        public decimal? SATURDAY_HALF_PEAK { get; set; }
        public string FormattedSATURDAY_HALF_PEAK
        {
            get
            {
                return SATURDAY_HALF_PEAK?.ToString("#,##0");
                //return SATURDAY_HALF_PEAK?.ToString("0");
            }
        }
        [Display(Name = "離峰用電度數")]
        public decimal? OFF_PEAK_ELECTRICITY { get; set; }
        public string FormattedOFF_PEAK_ELECTRICITY
        {
            get
            {
                return OFF_PEAK_ELECTRICITY?.ToString("#,##0");
                //return OFF_PEAK_ELECTRICITY?.ToString("0");
            }
        }
        [Display(Name = "總用電數")]
        public decimal? TOTAL_ELECTRICITY { get; set; }
        public string FormattedTOTAL_ELECTRICITY
        {
            get
            {
                return TOTAL_ELECTRICITY?.ToString("#,##0");
                //return TOTAL_ELECTRICITY?.ToString("0");
            }
        }
        [Display(Name = "總電費(含稅)")]
        public decimal? TOTAL_BILL_TAX { get; set; }
        public string FormattedTOTAL_BILL_TAX
        {
            get
            {
                //return TOTAL_BILL_TAX?.ToString("#,##0");
                return TOTAL_BILL_TAX?.ToString("C0");
                //顯示成金額格式
            }
        }
        [Display(Name = "本期碳排量")]
        public decimal? CARBON_PERIOD { get; set; }
        public string FormattedCARBON_PERIOD
        {
            get
            {
                return CARBON_PERIOD?.ToString("#,##0");
                //return CARBON_PERIOD?.ToString("0");
            }
        }
        [Display(Name = "碳排係數")]
        public decimal? CARBON_EMISSION_FACTOR { get; set; }
        [Display(Name = "二氧化碳當量")]
        public decimal? CARBON_DIOXIDE { get; set; }
        [Display(Name = "建立時間")]
        public DateTime? data { get; set; }
        [Display(Name = "建立者")]
        public string CreatedBy { get; set; }
        [Display(Name = "電費繳費通知單:上傳 PDF 檔案")]
        [MaxLength]
        public byte[] PDF_FILE { get; set; }
        [HiddenInput(DisplayValue = false)]
        public string ImageMimeType { get; set; }
        [Display(Name = "電費繳費通知單:上傳(最大2MB)")]
        public byte[] PDF_CONTENT { get; set; }
        [Display(Name = "傳票號碼")]
        [StringLength(200)]
        public string VOUCHER_NUMBER { get; set; }
    }
}
解釋程式碼
這個代碼定義了一個名為 ELECTRICITY_BILL 的實體類,主要用於表示電費單數據。在 ASP.NET MVC 項目中,這個類利用了 Entity Framework 來映射數據庫中的 ELECTRICITY_BILL 表,並使用 Data Annotations 進行數據驗證和屬性顯示。下面是該類的詳細解釋:
namespace WebApplication5.Models: 這是類所在的命名空間,通常與項目名相關聯。public partial class ELECTRICITY_BILL: 這是一個實體類,使用 partial 關鍵字允許該類在多個文件中定義。[Table("ELECTRICITY_BILL")]: 表示該類對應數據庫中的 ELECTRICITY_BILL 表。DOCUMENT_ID:
[Key]: 這是主鍵字段,唯一標識每條記錄。[Required(ErrorMessage = "必填")]: 表示該字段是必填項,如果為空,會顯示 "必填" 的錯誤信息。[StringLength(200)]: 限制字符串長度為 200。[Display(Name = "通知單號碼")]: 前端顯示為 "通知單號碼"。FACTORY、ELECTRICITY_SIGNAL:
FROM_BILLING_PERIOD、UNTIL_BILLING_PERIOD:
DateTime? 類型的屬性,表示計費期間的開始和結束時間。[Column(TypeName = "datetime2")]: 在數據庫中使用 datetime2 類型存儲。FormattedFROM_BILLING_PERIOD 和 FormattedUNTIL_BILLING_PERIOD 是計算屬性,用於將日期格式化為 yyyy-MM-dd 的字符串。PEAK_ELECTRICITY、HALF_SPIKE_POWER、SATURDAY_HALF_PEAK、OFF_PEAK_ELECTRICITY、TOTAL_ELECTRICITY:
decimal? 類型。FormattedPEAK_ELECTRICITY),用於格式化顯示度數(格式為 #,##0,即千位分隔符)。TOTAL_BILL_TAX:
decimal? 類型。FormattedTOTAL_BILL_TAX: 將金額格式化為貨幣格式(C0,即無小數點的貨幣形式)。CARBON_PERIOD、CARBON_EMISSION_FACTOR、CARBON_DIOXIDE:
CreatedBy:
PDF_FILE、PDF_CONTENT:
byte[] 類型的屬性用於存儲 PDF 文件的數據。[MaxLength]: 表示字段的最大長度,可以存儲大數據。ImageMimeType:
VOUCHER_NUMBER:
HiddenInput(DisplayValue = false): 隱藏字段不在用戶界面顯示。FormattedTOTAL_ELECTRICITY)可以方便地將原始數據轉化為更加人性化的顯示格式,避免在視圖層編寫覆雜的邏輯。這個類展示了一個電費賬單的基本信息,其中包含了電費單的編號、工廠信息、用電量、碳排放以及上傳的 PDF 文件等。通過使用 Data Annotations 進行驗證和格式化,它為前端視圖提供了友好的展示和用戶輸入校驗。
ProductDBContext也要填上,可以參考前面說明
Controllers裡面的Entities>
[AllowAnonymous]
        public ActionResult ElectricityList2(string factory = "")
        {
            ViewBag.Layout = "~/Views/Shared/_Layout.cshtml";
            var currentUser = Session["Member"] as tMember;
            // 檢索當前用戶的UpdateRight值
            string updateRight = GetUserUpdateRight(currentUser);
            var list = _db.tMember.ToList();
            var customers = _db.ELECTRICITY_BILL.ToList();
            DateTime startDate;
            DateTime endDate;
            if (!String.IsNullOrEmpty(Request.QueryString["startDate"]))
            {
                startDate = DateTime.Parse(Request.QueryString["startDate"]);
            }
            else
            {
                startDate = DateTime.MinValue;
            }
            if (!String.IsNullOrEmpty(Request.QueryString["endDate"]))
            {
                endDate = DateTime.Parse(Request.QueryString["endDate"]);
            }
            else
            {
                endDate = DateTime.MaxValue;
            }
            var ESGs = _db.ELECTRICITY_BILL
            .OrderByDescending(x => x.FROM_BILLING_PERIOD)
            .Where(x => x.FROM_BILLING_PERIOD >= startDate &&
            x.FROM_BILLING_PERIOD <= endDate)
            .ToList();
            if (!string.IsNullOrEmpty(factory))
            {
                ESGs = ESGs.Where(x => x.FACTORY == factory).ToList();
            }
            ViewBag.UpdateRight = updateRight;
            // 20240326將 PDF 檔案內容傳遞給視圖
            foreach (var item in customers)
            {
                item.ImageMimeType = "application/pdf";
            }
            return View(ESGs);
        }
        // 添加一個方法來檢索當前用戶的UpdateRight值
        private string GetUserUpdateRight(tMember user)
        {
            if (user != null)
            {
                // 假設UpdateRight是tMember類中的屬性
                return user.UpdateRight;
            }
            // 返回默認值或處理用戶不可用的情況
            return "N";
        }
解釋程式碼
這段代碼定義了一個名為 ElectricityList2 的 ASP.NET MVC 控制器方法,用於檢索並返回電力賬單的列表,並根據用戶的權限決定頁面的顯示。
[AllowAnonymous]:
ElectricityList2 動作方法。即使用戶未登錄,也可以調用該方法。public ActionResult ElectricityList2(string factory = ""):
ElectricityList2 的控制器方法,返回一個 ActionResult,方法的參數是 factory,默認為空字符串。factory 是用來過濾電力賬單的工廠名稱。ViewBag.Layout:
_Layout.cshtml。var currentUser = Session["Member"] as tMember:
Session 中獲取當前登錄用戶(tMember 類型),並將其存儲在 currentUser 變量中。Session["Member"] 用於從服務器端的會話中存儲用戶信息。string updateRight = GetUserUpdateRight(currentUser):
GetUserUpdateRight,獲取當前用戶的 UpdateRight 權限。UpdateRight 應該是 tMember 類的一個屬性,用於判斷用戶是否有更新權限。var list = _db.tMember.ToList():
tMember 表中的所有記錄,並將其轉換為列表存儲在 list 中。var customers = _db.ELECTRICITY_BILL.ToList():
ELECTRICITY_BILL 表中的所有記錄,並將其轉換為列表存儲在 customers 中。處理查詢字符串中的 startDate 和 endDate:
startDate 和 endDate。DateTime.MinValue 和 DateTime.MaxValue,即沒有限制的時間範圍。檢索並篩選電力賬單記錄:
ELECTRICITY_BILL 表中檢索所有記錄,並根據 FROM_BILLING_PERIOD 過濾賬單的時間範圍。factory 參數,進一步過濾記錄,確保只包含指定工廠的數據。ViewBag.UpdateRight:
updateRight 值存儲在 ViewBag 中,方便在視圖中使用該值來確定用戶是否有權限進行某些操作。PDF文件處理:
customers 列表時,將每個賬單的 ImageMimeType 屬性設置為 "application/pdf"。這可能用於在視圖中渲染 PDF 文件。return View(ESGs):
ESGs(電力賬單列表)給視圖,視圖將使用這些數據進行渲染。GetUserUpdateRight 方法:UpdateRight 權限。UpdateRight 屬性值。"N"(表示沒有權限)。UpdateRight 權限控制,系統將確定用戶是否有修改權限。產生畫面View程式碼
@model IEnumerable<WebApplication5.Models.ELECTRICITY_BILL>
@{
    Layout = "~/Views/Shared/_Layout.cshtml";
}
@{
    ViewBag.Title = "ElectricityList2";
}
<h2>作品-電費</h2>
<h3>依照電費看到的內容</h3>
<style>
    .align-right {
        text-align: right;
    }
</style>
<div style="margin-top: 50px;">
    <h2>電費:列表</h2>
    <p>
        @*@Html.ActionLink("電費:新增", "ElectricityCreate")*@
        @Html.ActionLink("電費:新增", "ElectricityCreate", null, new { @class = "btn btn-danger" })
    
    </p>
            <form method="get" action="@Url.Action("ElectricityList", "Home")">
                <label for="startDate">開始日期:</label>
                <input type="date" name="startDate">
                <label for="endDate">結束日期:</label>
                <input type="date" name="endDate">
                <button type="submit">搜索</button>
            </form>
        </div>
        @using (Html.BeginForm())
        {
            <label>廠區:</label>
            @Html.DropDownList("factory", new List<SelectListItem>
        {
          new SelectListItem { Value = "永康廠", Text = "永康廠/電號:01-23-4567-89-0" },
          new SelectListItem { Value = "永科廠", Text = "永科廠/電號:01-23-4567-89-1" }
        })
            <input type="submit" value="搜索" />
        }
        <table class="table" style="margin-top: 20px;">
            <thead>
                <tr>
                    <th>
                        @Html.DisplayNameFor(model => model.DOCUMENT_ID)
                    </th>
                    <th>
                        @Html.DisplayNameFor(model => model.FROM_BILLING_PERIOD)
                    </th>
                    <th>
                        @Html.DisplayNameFor(model => model.UNTIL_BILLING_PERIOD)
                    </th>
                    <th>
                        @Html.DisplayNameFor(model => model.PEAK_ELECTRICITY)
                    </th>
                    <th>
                        @Html.DisplayNameFor(model => model.HALF_SPIKE_POWER)
                    </th>
                    <th>
                        @Html.DisplayNameFor(model => model.SATURDAY_HALF_PEAK)
                    </th>
                    <th>
                        @Html.DisplayNameFor(model => model.OFF_PEAK_ELECTRICITY)
                    </th>
                    <th>
                        @Html.DisplayNameFor(model => model.TOTAL_ELECTRICITY)
                    </th>
                    <th>
                        @Html.DisplayNameFor(model => model.TOTAL_BILL_TAX)
                    </th>
                    <th>
                        @Html.DisplayNameFor(model => model.CARBON_PERIOD)
                    </th>
                    <th>
                        @Html.DisplayNameFor(model => model.VOUCHER_NUMBER)
                    </th>
                    <th>
                        電費繳費通知單:上傳
                    </th>
                    <th></th>
                </tr>
            </thead>
            <tbody>
                @foreach (var item in Model)
                {
                    <tr>
                        <td>
                            @Html.DisplayFor(modelItem => item.DOCUMENT_ID)
                        </td>
                        <td>
                            @*@Html.DisplayFor(modelItem => item.FROM_BILLING_PERIOD)*@
                            @Html.DisplayFor(modelItem => item.FormattedFROM_BILLING_PERIOD)
                            </td>
                            <td>
                                @*@Html.DisplayFor(modelItem => item.UNTIL_BILLING_PERIOD)*@
                                @Html.DisplayFor(modelItem => item.FormattedUNTIL_BILLING_PERIOD)
                            </td>
                            <td class="align-right">
                                @*@Html.DisplayFor(modelItem => item.PEAK_ELECTRICITY)*@
                                @Html.DisplayFor(modelItem => item.FormattedPEAK_ELECTRICITY)
                            </td>
                            <td class="align-right">
                                @*@Html.DisplayFor(modelItem => item.HALF_SPIKE_POWER)*@
                                @Html.DisplayFor(modelItem => item.FormattedHALF_SPIKE_POWER)
                            </td>
                            <td class="align-right">
                                @*@Html.DisplayFor(modelItem => item.SATURDAY_HALF_PEAK)*@
                                @Html.DisplayFor(modelItem => item.FormattedSATURDAY_HALF_PEAK)
                            </td>
                            <td class="align-right">
                                @*@Html.DisplayFor(modelItem => item.OFF_PEAK_ELECTRICITY)*@
                                @Html.DisplayFor(modelItem => item.FormattedOFF_PEAK_ELECTRICITY)
                            </td>
                            <td class="align-right">
                                @*@Html.DisplayFor(modelItem => item.TOTAL_ELECTRICITY)*@
                                @Html.DisplayFor(modelItem => item.FormattedTOTAL_ELECTRICITY)
                            </td>
                            <td class="align-right">
                                @*@Html.DisplayFor(modelItem => item.TOTAL_BILL_TAX)*@
                                @Html.DisplayFor(modelItem => item.FormattedTOTAL_BILL_TAX)
                            </td>
                            <td class="align-right">
                                @*@Html.DisplayFor(modelItem => item.CARBON_PERIOD)*@
                                @Html.DisplayFor(modelItem => item.FormattedCARBON_PERIOD)
                            </td>
                            <td>
                                @Html.DisplayFor(modelItem => item.VOUCHER_NUMBER)
                            </td>
                            <td>
                                @if (item.PDF_CONTENT != null && item.PDF_CONTENT.Length > 0)
                                {
                                    <a href="@Url.Action("GetPdfFile1", "Home", new { id = item.DOCUMENT_ID })" target="_blank">檢視 PDF 檔案</a>
                                }
                                else
                                {
                                    <span>沒有上傳 PDF 檔案</span>
                                }
                            </td>
                            <td>
                                @*@Html.ActionLink("修改", "ElectricityEdit", new { id = item.DOCUMENT_ID })*@
                                @if (ViewBag.UpdateRight == "Y")
        {
        @Html.ActionLink("修改", "ElectricityEdit", new { id = item.DOCUMENT_ID })
        }
                            </td>
                            </tr>
                            }
                            </tbody>
                            </table>
                            </body>
                            </html>
解釋程式碼
這段程式碼是一個使用 ASP.NET MVC 框架和 Razor 語法撰寫的視圖(View),用於顯示和管理電費相關的資料。以下是對程式碼的詳細解釋:
@model IEnumerable<WebApplication5.Models.ELECTRICITY_BILL>
@{
    Layout = "~/Views/Shared/_Layout.cshtml";
}
@{
    ViewBag.Title = "ElectricityList2";
}
IEnumerable<WebApplication5.Models.ELECTRICITY_BILL>,即一個電費帳單的集合。~/Views/Shared/_Layout.cshtml,這樣可以重用網站的統一樣式和結構。<h2>作品-電費</h2>
<h3>依照電費看到的內容</h3>
<style>
    .align-right {
        text-align: right;
    }
</style>
.align-right 的 CSS 類,用於將文本對齊到右邊。<div style="margin-top: 50px;">
    <h2>電費:列表</h2>
    <p>
        @Html.ActionLink("電費:新增", "ElectricityCreate", null, new { @class = "btn btn-danger" })
    </p>
@Html.ActionLink 創建一個連結按鈕,文字為 "電費:新增",導航到 ElectricityCreate 動作方法,並應用了 Bootstrap 的 btn btn-danger 樣式,使按鈕呈現紅色。<form method="get" action="@Url.Action("ElectricityList", "Home")">
    <label for="startDate">開始日期:</label>
    <input type="date" name="startDate">
    <label for="endDate">結束日期:</label>
    <input type="date" name="endDate">
    <button type="submit">搜索</button>
</form>
Home 控制器的 ElectricityList 動作方法。@using (Html.BeginForm())
{
    <label>廠區:</label>
    @Html.DropDownList("factory", new List<SelectListItem>
    {
        new SelectListItem { Value = "永康廠", Text = "永康廠/電號:01-23-4567-89-0" },
        new SelectListItem { Value = "永科廠", Text = "永科廠/電號:01-23-4567-89-1" }
    })
    <input type="submit" value="搜索" />
}
<table class="table" style="margin-top: 20px;">
    <thead>
        <tr>
            <th>@Html.DisplayNameFor(model => model.DOCUMENT_ID)</th>
            <th>@Html.DisplayNameFor(model => model.FROM_BILLING_PERIOD)</th>
            <th>@Html.DisplayNameFor(model => model.UNTIL_BILLING_PERIOD)</th>
            <th>@Html.DisplayNameFor(model => model.PEAK_ELECTRICITY)</th>
            <th>@Html.DisplayNameFor(model => model.HALF_SPIKE_POWER)</th>
            <th>@Html.DisplayNameFor(model => model.SATURDAY_HALF_PEAK)</th>
            <th>@Html.DisplayNameFor(model => model.OFF_PEAK_ELECTRICITY)</th>
            <th>@Html.DisplayNameFor(model => model.TOTAL_ELECTRICITY)</th>
            <th>@Html.DisplayNameFor(model => model.TOTAL_BILL_TAX)</th>
            <th>@Html.DisplayNameFor(model => model.CARBON_PERIOD)</th>
            <th>@Html.DisplayNameFor(model => model.VOUCHER_NUMBER)</th>
            <th>電費繳費通知單:上傳</th>
            <th></th>
        </tr>
    </thead>
    <tbody>
        @foreach (var item in Model)
        {
            <tr>
                <td>@Html.DisplayFor(modelItem => item.DOCUMENT_ID)</td>
                <td>@Html.DisplayFor(modelItem => item.FormattedFROM_BILLING_PERIOD)</td>
                <td>@Html.DisplayFor(modelItem => item.FormattedUNTIL_BILLING_PERIOD)</td>
                <td class="align-right">@Html.DisplayFor(modelItem => item.FormattedPEAK_ELECTRICITY)</td>
                <td class="align-right">@Html.DisplayFor(modelItem => item.FormattedHALF_SPIKE_POWER)</td>
                <td class="align-right">@Html.DisplayFor(modelItem => item.FormattedSATURDAY_HALF_PEAK)</td>
                <td class="align-right">@Html.DisplayFor(modelItem => item.FormattedOFF_PEAK_ELECTRICITY)</td>
                <td class="align-right">@Html.DisplayFor(modelItem => item.FormattedTOTAL_ELECTRICITY)</td>
                <td class="align-right">@Html.DisplayFor(modelItem => item.FormattedTOTAL_BILL_TAX)</td>
                <td class="align-right">@Html.DisplayFor(modelItem => item.FormattedCARBON_PERIOD)</td>
                <td>@Html.DisplayFor(modelItem => item.VOUCHER_NUMBER)</td>
                <td>
                    @if (item.PDF_CONTENT != null && item.PDF_CONTENT.Length > 0)
                    {
                        <a href="@Url.Action("GetPdfFile1", "Home", new { id = item.DOCUMENT_ID })" target="_blank">檢視 PDF 檔案</a>
                    }
                    else
                    {
                        <span>沒有上傳 PDF 檔案</span>
                    }
                </td>
                <td>
                    @if (ViewBag.UpdateRight == "Y")
                    {
                        @Html.ActionLink("修改", "ElectricityEdit", new { id = item.DOCUMENT_ID })
                    }
                </td>
            </tr>
        }
    </tbody>
</table>
表格標頭(thead): 使用 @Html.DisplayNameFor 方法動態獲取模型屬性的顯示名稱,如 DOCUMENT_ID、FROM_BILLING_PERIOD 等。最後一欄標題為 "電費繳費通知單:上傳"。
表格內容(tbody): 使用 @foreach 迴圈遍歷模型中的每一個電費帳單(item),並為每個帳單生成一行(<tr>)。
資料欄位:
@Html.DisplayFor 用於顯示每個屬性的值。例如,item.DOCUMENT_ID 顯示文件ID,item.FormattedFROM_BILLING_PERIOD 顯示格式化後的開始計費期間。.align-right 類,使數值右對齊,增強可讀性。PDF 檔案連結:
item.PDF_CONTENT 是否存在且有內容。Home 控制器的 GetPdfFile1 動作方法,並傳遞 DOCUMENT_ID 作為參數,以顯示相應的 PDF 檔案。修改連結:
ViewBag.UpdateRight 是否為 "Y"(表示有修改權限)。ElectricityEdit 動作方法,並傳遞 DOCUMENT_ID 作為參數。</body>
</html>
body 和 html 標籤。這個視圖主要功能包括:
這樣的設計有助於用戶有效地管理和查看電費相關的數據,並且透過篩選和權限控制,提升了系統的靈活性和安全性。
大家明天見~